无向图dfs判断是否有环和是否二分图

1:判断无向图是否有环: 如果图g有环,用dfs遍历图g, 会访问到已经访问过的顶点。
2:判断无向图是否为二分图: 利用gfs遍历图给图上色(2种颜色),然后判断上色顶点间是否冲突。若冲突,则为非二分图。


package Graph;
 
import java.util.ArrayList;
import java.util.LinkedList;
 
public class Graph {
    private ArrayList<LinkedList<Element>> tableGrap;
    private int v;//顶点数
    private int e;//边数
     
    private boolean[] isVisited;//顶点的访问状态
    private boolean hasCycle;//是否有环
     
    private boolean[] color;//给图上色(两种颜色),用以判断是否二分图
    private boolean isTwoColorable = true;//是否二分图
     
    public Graph(int v,LinkedList<Element> list){
        this.v = v;
        isVisited = new boolean[v];
         
        tableGrap = new ArrayList<>();
        for(int i=0;i<v;i++)
            tableGrap.add(new LinkedList<Element>());
         
        create(list);
    }
 
    private void create(LinkedList<Element> list) {
        // TODO Auto-generated method stub
        for (Element ele : list) {
            tableGrap.get(ele.u).add(ele);
            tableGrap.get(ele.v).add(new Element(ele.v,ele.u));
            e++;
        }
    }
     
    //判断是否二分图
    public void isTwoGraph(){
        isVisited = new boolean[v];
        color = new boolean[v];
         
        for(int s=0;s<v;s++){
            if(!isVisited[s])
                dfs(s);
        }
    }
    //用dfs给顶点上色判断是否二分图
    private void dfs(int u){
        isVisited[u] =  true;
        for(Element ele : tableGrap.get(u)){
            if(!isVisited[ele.v]){
                color[ele.v] = !color[u];
                dfs(ele.v);
            }
            else if(color[ele.v] == color[v]) {
                System.out.println("非二分图")
                isTwoColorable = false;
            }
        }
    }
     
    //是否有环
    public void isCycle(){
        isVisited = new boolean[v];
        for(int s=0;s<v;s++){
            if(!isVisited[s])
                dfs(this,s,s);
        }
    }
     
    //dfs判断是否有环
    private void dfs(Graph graph, int v, int u) {
        // TODO Auto-generated method stub
        isVisited[v] = true;
        for(Element ele : tableGrap.get(v)){
            if(!isVisited[ele.v]){
                dfs(this,ele.v,v);
            }else{
                if(ele.v != u) {
                    hasCycle = true;
                    System.out.println("有环");//访问已经访问过的顶点,说明有环
                }
            }
        }
    }
 
    public static void main(String[] args){
        LinkedList<Element> list = new LinkedList<>();
        list.add(new Element(0,2));
        list.add(new Element(0, 1));
        list.add(new Element(0, 5));
        list.add(new Element(2,1));
        list.add(new Element(2,3));
        list.add(new Element(2,4));
        list.add(new Element(3,4));
        list.add(new Element(5,3));
         
        Graph graph = new Graph(6, list);
        graph.isCycle();
        graph.isTwoGraph();
    }
     
}
 
//
class Element{
    int u;
    int v;
    int weight;
     
    public Element(int u,int v){
        this.u = u;
        this.v = v;
//      this.weight = we
    }
}


  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值